This interactive report is designed for BMW’s Chief Marketing
Officer (CMO).
Using BMW’s worldwide sales records from 2010–2024, the
goal is to:
The first chart compares annual EV sales across six global
regions.
Each line shows the total sales volume for all BMW EV models in that
region and year.
This view shows where EV demand is gaining momentum
and where it is stagnating.
Regions with strong upward trends (for example, Asia or
the Middle East) are candidates for
expansion in 2026, while flat or declining regions
suggest a strategy that stabilizes or optimizes
existing investment.
p1 <- sd_region_year %>%
plot_ly(
x = ~Year,
y = ~total_sales,
color = ~Region,
colors = region_colors,
type = "scatter",
mode = "lines+markers",
hovertemplate = paste(
"<b>%{customdata[1]}</b><br>",
"Year: %{x}<br>",
"Total sales: %{y}<extra></extra>"
),
customdata = ~Region
) %>%
layout(
title = list(
text = "Regional EV Sales Trends (2010–2024)",
x = 0
),
xaxis = list(title = "Year"),
yaxis = list(title = "Total EV Sales")
)
controls <- filter_select(
id = "region_filter",
label = "Focus on one region (controls linked charts below):",
sharedData = sd_region_year,
group = ~Region
)
bscols(widths = c(4, 8), controls, p1)
After focusing on a region using the selector above, the chart updates automatically to show that region’s top 10 models by total EV sales.
Once high-growth regions are identified, the CMO needs to understand
which specific models are driving that growth.
These are the models that may deserve:
Models with low sales in high-growth regions may signal positioning issues or gaps in awareness.
fuel_palette_hex <- c(
"Electric" = "#A8C5FF", # pastel blue
"Hybrid" = "#C8B0E8", # pastel purple
"Petrol" = "#B7E4C7", # pastel green
"Diesel" = "#FFE8A3" # pastel yellow
)
p2 <- sd_model_region %>%
plot_ly(
x = ~total_sales,
y = ~reorder(Model, total_sales),
type = "bar",
orientation = "h",
color = ~Fuel_Type,
colors = fuel_palette_hex,
hovertemplate = "<b>%{y}</b><br>Fuel Type: %{color}<br>Total Sales: %{x:,}<extra></extra>"
) %>%
layout(
title = list(text = "Top 10 Models in Selected Region", x = 0),
xaxis = list(title = "Total Sales", tickformat = ","),
yaxis = list(title = "", tickfont = list(size = 14)),
plot_bgcolor = "#FFFFFF",
paper_bgcolor = "#FFFFFF",
margin = list(l = 120, r = 40)
)
p2
This chart compares the fuel-type mix in each
region: Electric, Hybrid, Petrol, and Diesel.
A region with a higher share of Electric and
Hybrid vehicles is generally more ready for EV-focused
campaigns and infrastructure partnerships.
Fuel-type composition is a strong indicator of regional EV
readiness.
This chart therefore helps the CMO align:
with regional readiness.
p3 <- sd_fuel_region %>%
plot_ly(
x = ~Region,
y = ~n,
color = ~Fuel_Type,
type = "bar",
hovertemplate = paste(
"<b>%{x}</b><br>",
"Fuel type: %{legendgroup}<br>",
"Vehicle count: %{y}<extra></extra>"
)
) %>%
layout(
barmode = "stack",
title = list(text = "Fuel-Type Mix by Region", x = 0),
xaxis = list(title = ""),
yaxis = list(title = "Number of Vehicles")
)
p3
This heatmap visualizes BMW’s EV sales intensity
across regions and years.
Darker colors represent higher total sales in a given region-year
pair.
This view makes it easy to identify:
Understanding temporal sales concentration helps the CMO allocate budgets to regions with sustained or accelerating adoption.
# 自定义颜色渐变
custom_palette <- list(
c(0, "#FFFFFF"),
c(0.25, "#E9F2FA"),
c(0.5, "#C4DDF2"),
c(0.75, "#8BBCE3"),
c(1, "#508ECF")
)
# 重建 region-year 数据(确保干净无 NA)
region_year <- bmw %>%
group_by(Region, Year) %>%
summarise(total_sales = sum(Sales_Volume), .groups = "drop")
# 创建交互式热力图
p4 <- plot_ly(
data = region_year,
x = ~Year,
y = ~Region,
z = ~total_sales,
type = "heatmap",
colorscale = custom_palette,
hovertemplate = paste(
"<b>Region:</b> %{y}<br>",
"Year: %{x}<br>",
"Sales: %{z}<extra></extra>"
)
) %>%
layout(
title = "BMW EV Sales Heatmap (Interactive)",
xaxis = list(title = "Year"),
yaxis = list(title = "Region")
)
p4
Price–Sales Correlation by Region
datatable(
price_sensitivity %>%
mutate(cor_price_sales = round(cor_price_sales, 4)),
rownames = FALSE,
options = list(dom = "t", pageLength = 6)
)
BMW’s EV expansion strategy for 2026 must be guided by insights into:
Use these interactive insights to guide: